/**
 * Copyright 2019 asiainfo Inc.
 **/
package com.myz.rabbitmqspring.spring.listen;

import com.myz.rabbitmqspring.spring.retry.RetryCache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;


/**
 * 实现消息确认机制
 *
 * @author maoyz0621 on 19-1-16
 * @version: v1.0
 */
public class ConfirmCallbackListener implements RabbitTemplate.ConfirmCallback {

    private static final Logger log = LoggerFactory.getLogger(ConfirmCallbackListener.class);

    /**
     * Confirmation callback.
     *
     * @param correlationData 回调的相关数据.
     * @param ack             true for ack, false for nack
     * @param cause           专门给NACK准备的一个可选的原因，其他情况为null。
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        log.debug("消息发送到交换机确认机制, 回调id {}:" + correlationData);

        log.debug("Exchange接收是否成功（ack）: {} 。 返回的用户参数（correlationData）: {}。NACK原因（cause） : {}", ack, correlationData, cause);

        RetryCache retryCache = new RetryCache();

        if (ack) {
            log.info("消息发送到exchange成功");
            // 删除 msgId 与 Message 的关系
            retryCache.del(Long.valueOf(correlationData.getId()));

        } else {
            log.error("消息发送到exchange失败:{}", cause);
            // todo 消息发送到exchange失败 ， 重新发送
        }

    }
}
